package cn.wolfcode.shop.mapper;

import cn.wolfcode.shop.domain.OrderInfo;
import org.apache.ibatis.annotations.*;

@Mapper
public interface OrderInfoMapper {

    @Insert("insert into t_order_info(order_no,user_id,good_id,delivery_addr_id,good_name,good_img,good_count,good_price,seckill_price,status,create_date,pay_date) values(#{orderNo},#{userId},#{goodId},#{deliveryAddrId},#{goodName},#{goodImg},#{goodCount},#{goodPrice},#{seckillPrice},#{status},#{createDate},#{payDate})")
    void insert(OrderInfo orderInfo);

    @Select("SELECT * FROM t_order_info WHERE order_no = #{orderNo} AND user_id = #{userId}")
    OrderInfo selectByIdAndUserId(@Param("orderNo") String orderNo, @Param("userId") Long userId);

    /**
     * 通过乐观锁的方式，直接判断条件订单状态为未支付的进行更新，
     * 既可以判断订单是否超时，又可以通过返回受影响的行来表示修改结果：
     * 0：修改失败，表示订单是已经支付的
     * 1：修改成功，表示订单是属于超时未支付的
     *
     * @param orderNo
     */
    @Update("UPDATE t_order_info SET status = 4 WHERE order_no = #{orderNo} AND status = 0")
    int updateTimeoutStatus(String orderNo);

    // 回补 MySQL 中的库存
    @Update("UPDATE t_seckill_goods SET stock_count = stock_count + 1 WHERE id = #{seckillId}")
    void incrStockCount(Long seckillId);


    /**
     * 支付宝异步通知回来，对订单状态进行修改为 已支付
     *
     * @param orderNo
     * @return
     */
    @Update("UPDATE t_order_info SET status = 1 WHERE order_no = #{orderNo} AND status = 0")
    int updatePaySuccess(String orderNo);
}
